package api;

import java.util.*;
import persistencia.XMLmanager;
import interfaces.Notificador;

public class ControlDispositivos {
	private List<Dispositivo> dispositivosEdificio = new ArrayList<Dispositivo>();
	private List<Class> dispositivosDisponibles = new ArrayList<Class>();
	private String pathArchivo;	
	private XMLmanager xmlManager;
	private ControlReflection managerReflection;
	
	private static ControlDispositivos instanciaUnica = null;
	
	private ControlDispositivos(){}
	
	private static void crearInstancia(){
		instanciaUnica = new ControlDispositivos();
	}
	
	// Eleva una excepcion en caso de que se quiera clonar la clase
	public Object clone() throws CloneNotSupportedException {
		throw new CloneNotSupportedException();
	}
	
	public static ControlDispositivos obtenerInstancia(){
		if (instanciaUnica == null) crearInstancia();
		return instanciaUnica;
	}
	
	private void cargarDispositivosEdificios(String pathXML){
		if (this.xmlManager == null) {
			this.xmlManager = new XMLmanager(pathXML);
		}
		//this.xmlManager.hidratar(this.dispositivosEdificio);
	}
	
	private void cargarDispositivosDisponibles(String nombrePaquete){
		if (this.managerReflection == null){
			this.managerReflection = new ControlReflection();
		}
		this.dispositivosDisponibles = this.managerReflection.getClases(nombrePaquete);
	}
	
	public void agregarDispositivoEdificio(Dispositivo dispositivo){
		this.dispositivosEdificio.add(dispositivo);
		API.obtenerInstancia().registrarNotificador(dispositivo.getNotificador());
	}
	
	public void agregarDispositivos(List<Dispositivo> dispositivo){
		this.dispositivosEdificio.addAll(dispositivo);
	}
	
	public void grabarDispositivosEdificio(){
		//TODO: serializar todo
	}
	
	public List<Dispositivo> getDispositivosEdificio(){
		return this.dispositivosEdificio;
	}
	
	public void recuperarDispositivosEdificio(String pathXML){
		this.cargarDispositivosEdificios(pathXML);
		//TODO: se deben generar todos los notificadores y cargarlos en la API		
	}
	
	public List<Class> getDispositivosDisponibles(String nombrePaquete){
		this.cargarDispositivosDisponibles(nombrePaquete);
		return this.dispositivosDisponibles;
		
	}

	public void eliminarDispositivo(Dispositivo disp) {
		this.dispositivosEdificio.remove(disp);
	}
}
